home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / pp / pp-6.0 / Tools / statgen / statp.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-12-18  |  7.2 KB  |  407 lines

  1. /* statp.c: produce awk-able stats */
  2.  
  3. # ifndef lint
  4. static char Rcsid[] = "@(#)$Header: /xtel/pp/pp-beta/Tools/statgen/RCS/statp.c,v 6.0 1991/12/18 20:33:14 jpo Rel $";
  5. # endif
  6.  
  7. /*
  8.  * $Header: /xtel/pp/pp-beta/Tools/statgen/RCS/statp.c,v 6.0 1991/12/18 20:33:14 jpo Rel $
  9.  *
  10.  * $Log: statp.c,v $
  11.  * Revision 6.0  1991/12/18  20:33:14  jpo
  12.  * Release 6.0
  13.  *
  14.  */
  15.  
  16.  
  17.  
  18. #include "util.h"
  19. #include <varargs.h>
  20.  
  21. char    *myname;
  22. int    lineno;
  23. static char *curfile;
  24.  
  25. static void process ();
  26. static int parseline ();
  27. static void adios (), advise ();
  28.  
  29. main (argc, argv)
  30. int    argc;
  31. char    **argv;
  32. {
  33.     extern char    *optarg;
  34.     extern int    optind;
  35.     int    opt;
  36.  
  37.     myname = argv[0];
  38.     while((opt = getopt(argc, argv, "")) != EOF)
  39.         switch (opt) {
  40.             default:
  41.             fprintf (stderr, "Usage: %s\n", myname);
  42.             break;
  43.         }
  44.     argc -= optind;
  45.     argv += optind;
  46.     if (argc > 0) {
  47.         while (argc > 0) {
  48.             FILE    *fp;
  49.  
  50.             if ((fp =fopen (*argv, "r")) == NULL)
  51.                 adios (*argv, "Can't open file");
  52.             process (fp, *argv);
  53.             fclose (fp);
  54.             argv ++; argc --;
  55.         }
  56.     }
  57.     else
  58.         process (stdin, "standard input");
  59.     exit (0);
  60. }
  61.  
  62. static void process (fp, name)
  63. FILE    *fp;
  64. char    *name;
  65. {
  66.     char    linebuf[BUFSIZ*4];
  67.  
  68.     curfile = name;
  69.     lineno = 1;
  70.     while (fgets (linebuf, sizeof linebuf, fp)) {
  71.         parseline (linebuf);
  72.         lineno ++;
  73.     }
  74. }
  75.  
  76. static int parseline (line)
  77. char    *line;
  78. {
  79.     int    month, day;
  80.     int    hour, mins, sec;
  81.     char    *cp, *p;
  82.     char    *argv[100];
  83.     int    argc, n;
  84.  
  85.     month = atoi (line);
  86.     if ((cp = index(line, '/')) == NULL)
  87.         return badline (line, "No / date separator");
  88.  
  89.     day = atoi (++cp);
  90.  
  91.     while (*cp && isspace (*cp))
  92.         cp ++;
  93.     while (*cp && isdigit(*cp))
  94.         cp ++;
  95.     while (*cp && isspace (*cp))
  96.         cp ++;
  97.  
  98.     if (sscanf (cp, "%d:%d:%d", &hour, &mins, &sec) != 3)
  99.         return badline (cp, "No hour:min:sec field");
  100.  
  101.     if ((cp = index (line, ')')) == NULL)
  102.         return badline (line, "No ')' in line");
  103.  
  104.     cp ++;
  105.     if (index (cp, '|'))
  106.         return badline (cp, "Line contains a '|'");
  107.  
  108.  
  109.     printf ("%d:%d:%d:%02d:%02d|", month, day, hour, mins, sec);
  110.  
  111.  
  112.     if ((p = index (cp, '>')) != NULL && p[-1] == '-')
  113.         p[-1] = *p = ' ';
  114.     argc = sstr2arg (cp, 100, argv, " \t\n=");
  115.  
  116.     if (lexequ (argv[0], "DR") == 0 )
  117.         return do_dr (argc, argv);
  118.     else if (lexequ (argv[0], "ok") == 0)
  119.         return do_basic (argc, argv);
  120.     else if (lexequ (argv[0], "deliv") == 0)
  121.          return do_deliv (argc, argv);
  122.     else 
  123.         return badline (argv[0], "unknown key");
  124. }
  125.  
  126. do_basic (argc, argv)
  127. int    argc;
  128. char    **argv;
  129. {
  130.     int n;
  131.  
  132. #define NF_NORM    18
  133.     if (argc != NF_NORM) {
  134.         char    buf[BUFSIZ];
  135.         (void) sprintf (buf,
  136.                 "Incorrect number of fields %d, expecting %d",
  137.                 argc, NF_NORM);
  138.         return badline (argv[0], buf);
  139.     }
  140.  
  141.     printf ("%s|%s|%s|%s|",
  142.         argv[0], argv[1], argv[2], argv[3]);
  143.  
  144.     n = 4;
  145.     if (lexequ (argv[n], "p1msgid"))
  146.         return badline (argv[n], "p1msgid missing");
  147.     printf ("%s|", argv[++n]);
  148.     n ++;
  149.  
  150.     if (lexequ(argv[n], "size"))
  151.         return badline(argv[n], "size missing");
  152.     printf ("%s|", argv[++n]);
  153.     n++;
  154.  
  155.     if (lexequ (argv[n], "sender"))
  156.         return badline (argv[n], "sender missing");
  157.     printf ("%s|%s|", argv[n+1], argv[n+2]);
  158.     n += 3;
  159.  
  160.     if (lexnequ (argv[n], "recip", 5))
  161.         return badline (argv[n], "recip missing");
  162.     printf ("%s|%s|%s|", argv[n+1], argv[n+2], argv[n+3]);
  163.     n += 4;
  164.  
  165.     if (lexequ (argv[n], "submit-time"))
  166.         return badline (argv[n], "submit-time missing");
  167.     printf ("%s\n", argv[n+1]);
  168.  
  169.     return OK;
  170. }    
  171.  
  172. do_dr (argc, argv)
  173. int    argc;
  174. char    **argv;
  175. {
  176.     int n;
  177.     int noneg;
  178.     char    *p;
  179.  
  180. #define NF_DROK    22
  181.     if (argc < NF_DROK) {
  182.         char    buf[BUFSIZ];
  183.         (void) sprintf (buf,
  184.                 "Incorrect number of fields %d, expecting at kleast %d",
  185.                 argc, NF_DROK);
  186.         return badline (argv[0], buf);
  187.     }
  188.  
  189.     printf ("%s|%s|%s|",
  190.         argv[0], argv[1], argv[2]);
  191.  
  192.     noneg = lexequ (argv[1], "negative") != 0;
  193.  
  194.     n = 3;
  195.     if (lexequ (argv[n], "p1msgid"))
  196.         return badline (argv[n], "p1msgid missing");
  197.     printf ("%s|", argv[++n]);
  198.     n++;
  199.  
  200.     if (lexequ(argv[n], "size"))
  201.         return badline (argv[n], "size missing");
  202.     printf ("%s|", argv[++n]);
  203.     n++;
  204.  
  205.     if (lexequ(argv[n], "inchan"))
  206.         return badline(argv[n], "inchan missing");
  207.     printf ("%s|", argv[++n]);
  208.     n++;
  209.  
  210.     if (lexequ (argv[n], "dr_dest"))
  211.         return badline (argv[n], "recip missing");
  212.     printf ("%s|%s|", argv[n+1], argv[n+2]);
  213.     n += 3;
  214.  
  215.     if (lexequ (argv[n], "outchan"))
  216.         return badline (argv[n], "outchan missing");
  217.     printf ("%s|", argv[++n]);
  218.     n++;
  219.  
  220.     if (lexequ (argv[n], "dr-src"))
  221.         return badline (argv[n], "dr-src missing");
  222.     printf ("%s|%s|", argv[n+1], argv[n+2]);
  223.     n += 3;
  224.  
  225.     if (lexequ (argv[n], "cur-channel"))
  226.         return badline (argv[n], "cur-channel missing");
  227.     printf ("%s", argv[++n]);
  228.     n ++;
  229.  
  230.     if (noneg) {
  231.         if (lexequ (argv[n], "submit-time"))
  232.             return badline(argv[n], "submit-time missing");
  233.         printf ("|%s", argv[n+1]);
  234.         n += 2;
  235.         
  236.         if (lexequ (argv[n], "queued-time"))
  237.             return badline(argv[n], "queued-time missing");
  238.         printf ("|%s", argv[n+1]);
  239.         n += 2;
  240.         
  241.     }
  242.  
  243.     if (n + 2 >= argc) {
  244.         putchar ('\n');
  245.         return OK;
  246.     }
  247.     else
  248.         putchar ('|');
  249.  
  250.     if (lexequ (argv[n], "reason"))
  251.         return badline (argv[n], "reason missing");
  252.     printf ("%s|", argv[++n]);
  253.     n ++;
  254.  
  255.     if (lexequ (argv[n], "diag"))
  256.         return badline (argv[n], "diag missing");
  257.     printf ("%s", argv[++n]);
  258.     n ++;
  259.  
  260.     if (n >= argc) {
  261.         putchar ('\n');
  262.         return OK;
  263.     }
  264.     else
  265.         putchar ('|');
  266.  
  267.     for (p = argv[n]; *p; p++)
  268.         if (*p == '\n')
  269.             *p = ' ';
  270.     printf ("%s\n", argv[n]);
  271.     return OK;
  272. }    
  273.  
  274. do_deliv (argc, argv)
  275. int    argc;
  276. char    **argv;
  277. {
  278.     int n;
  279.  
  280. #define NF_DELIV    19
  281.     if (argc != NF_DELIV) {
  282.         char    buf[BUFSIZ];
  283.         (void) sprintf (buf,
  284.                 "Incorrect number of fields %d, expecting %d",
  285.                 argc, NF_DELIV);
  286.         return badline (argv[0], buf);
  287.     }
  288.  
  289.     printf ("%s|%s|%s|%s|", argv[0], argv[1], argv[2], argv[3]);
  290.  
  291.     n = 4;
  292.     if (lexequ (argv[n], "p1msgid"))
  293.         return badline (argv[n], "p1msgid missing");
  294.     printf ("%s|", argv[++n]);
  295.     n++;
  296.  
  297.     if (lexequ (argv[n], "size"))
  298.         return badline (argv[n], "size missing");
  299.     printf ("%s|", argv[++n]);
  300.     n++;
  301.  
  302.     if (lexequ(argv[n], "sender"))
  303.         return badline(argv[n], "sender missing");
  304.     printf ("%s|", argv[++n]);
  305.     n++;
  306.  
  307.     printf ("%s|", argv[n]);
  308.     n++;
  309.  
  310.     if (lexequ (argv[n], "recip"))
  311.         return badline (argv[n], "recip missing");
  312.     printf ("%s|", argv[++n]);
  313.     n++;
  314.  
  315.     printf ("%s|", argv[n]);
  316.     n++;
  317.  
  318.     if (lexequ(argv[n], "submit-time"))
  319.         return badline(argv[n], "submit-time missing");
  320.     printf ("%s|", argv[++n]);
  321.     n ++;
  322.  
  323.     if (lexequ(argv[n], "queued-time"))
  324.         return badline (argv[n], "queued-time missing");
  325.     printf ("%s\n", argv[++n]);
  326.  
  327.     return OK;
  328. }    
  329.  
  330. int    badline (line, mesg)
  331. char    *line, *mesg;
  332. {
  333.     putchar ('\n');
  334.     advise (NULLCP, "Bad stat line '%s' line %d in %s: %s",
  335.         line, lineno, curfile, mesg);
  336.     return NOTOK;
  337. }
  338.  
  339. #ifndef    lint
  340. static void    _advise ();
  341.  
  342.  
  343. static void    adios (va_alist)
  344. va_dcl
  345. {
  346.     va_list ap;
  347.  
  348.     va_start (ap);
  349.  
  350.     _advise (ap);
  351.  
  352.     va_end (ap);
  353.  
  354.     _exit (1);
  355. }
  356. #else
  357. /* VARARGS */
  358.  
  359. static void    adios (what, fmt)
  360. char   *what,
  361.        *fmt;
  362. {
  363.     adios (what, fmt);
  364. }
  365. #endif
  366.  
  367.  
  368. #ifndef    lint
  369. static void    advise (va_alist)
  370. va_dcl
  371. {
  372.     va_list ap;
  373.  
  374.     va_start (ap);
  375.  
  376.     _advise (ap);
  377.  
  378.     va_end (ap);
  379. }
  380.  
  381.  
  382. static void  _advise (ap)
  383. va_list    ap;
  384. {
  385.     char    buffer[BUFSIZ];
  386.  
  387.     asprintf (buffer, ap);
  388.  
  389.     (void) fflush (stdout);
  390.  
  391.     fprintf (stderr, "%s: ", myname);
  392.     (void) fputs (buffer, stderr);
  393.     (void) fputc ('\n', stderr);
  394.  
  395.     (void) fflush (stderr);
  396. }
  397. #else
  398. /* VARARGS */
  399.  
  400. static void    advise (what, fmt)
  401. char   *what,
  402.        *fmt;
  403. {
  404.     advise (what, fmt);
  405. }
  406. #endif
  407.